#include <windows.h>
#include "CCastlevania.h"

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR llpCmdLine, int nCmdShow)
{
	CCastlevania::GetInstane(hInstance)->Run();
	return 0;
}






//// include the basic windows header files and the Direct3D header file
//#include <windows.h>
//#include <windowsx.h>
//#include <d3d9.h>
//#include <d3dx9.h>
//#include "Input.h"
//#include <math.h>
//
//
//// define the screen resolution
//#define SCREEN_WIDTH 800
//#define SCREEN_HEIGHT 480
//
//// include the Direct3D Library files
//#pragma comment (lib, "d3d9.lib")
//#pragma comment (lib, "d3dx9.lib")
//
//// global declarations
//LPDIRECT3D9 d3d;    // the pointer to our Direct3D interface
//LPDIRECT3DDEVICE9 d3ddev;    // the pointer to the device class
//LPDIRECT3DVERTEXBUFFER9 v_buffer = NULL;    // the pointer to the vertex buffer
//
//// function prototypes
//void initD3D(HWND hWnd);    // sets up and initializes Direct3D
//void render_frame(float, float, int, int, D3DCOLOR);    // renders a single frame
//void cleanD3D(void);    // closes Direct3D and releases memory
//void init_graphics(void);    // 3D declarations
//
//// SPRITE
//#define MARIO_IMAGE L"Images//logo.png"
//#define WIDTH_IMAGE 448
//#define HEIGHT_IMAGE 243
//#define ANIMATION_RATE 15
//#define TRANSPARENT_DEFAULT D3DCOLOR_XRGB(0, 155, 0)
//
//
//LPDIRECT3DTEXTURE9 _Image;
//LPD3DXSPRITE _SpriteHandler;
//void init_sprite(LPD3DXSPRITE SpriteHandler, LPWSTR FilePath);	// create sprite
//
//struct CUSTOMVERTEX { FLOAT X, Y, Z; DWORD COLOR; };
//#define CUSTOMFVF (D3DFVF_XYZ | D3DFVF_DIFFUSE)
//
//// the WindowProc function prototype
//LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
//
//
//// the entry point for any Windows program
//int WINAPI WinMain(HINSTANCE hInstance,
//	HINSTANCE hPrevInstance,
//	LPSTR lpCmdLine,
//	int nCmdShow)
//{
//	HWND hWnd;
//	WNDCLASSEX wc;
//
//	ZeroMemory(&wc, sizeof(WNDCLASSEX));
//
//	wc.cbSize = sizeof(WNDCLASSEX);
//	wc.style = CS_HREDRAW | CS_VREDRAW;
//	wc.lpfnWndProc = WindowProc;
//	wc.hInstance = hInstance;
//	wc.hCursor = LoadCursor(NULL, IDC_ARROW);
//	wc.lpszClassName = L"WindowClass";
//
//	RegisterClassEx(&wc);
//
//	hWnd = CreateWindowEx(NULL, L"WindowClass", L"Our Direct3D Program",
//		WS_OVERLAPPEDWINDOW, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT,
//		NULL, NULL, hInstance, NULL);
//
//	ShowWindow(hWnd, nCmdShow);
//
//	// set up and initialize Direct3D
//	initD3D(hWnd);
//
//	// initialize sprite
//	HRESULT res = D3DXCreateSprite(d3ddev, &_SpriteHandler);
//	init_sprite(_SpriteHandler, MARIO_IMAGE);
//
//
//	// enter the main loop:
//
//	MSG msg;
//
//	int done = 0;
//	int _DeltaTime = 0;
//	DWORD frame_start = GetTickCount();;
//	DWORD tick_per_frame = 1000 / ANIMATION_RATE;
//
//	int index = 0;
//	float x_mario = SCREEN_WIDTH / 2;
//	float y_mario = SCREEN_HEIGHT / 2;
//	int alpha = 255;
//
//	float vt = 0.6f;
//	float offset = 40.0f;
//
//	bool isStop = false;
//
//	while (TRUE)
//	{
//		while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
//		{
//			TranslateMessage(&msg);
//			DispatchMessage(&msg);
//		}
//
//		if (msg.message == WM_QUIT)
//			break;
//
//		DWORD now = GetTickCount();
//		_DeltaTime = now - frame_start;
//
//		if (_DeltaTime >= tick_per_frame)
//		{
//			frame_start = now;
//
//			/*if (!isStop)
//			{
//			x_mario += 0;
//			y_mario -= vt * _DeltaTime;
//			vt += 0.32f;
//			}*/
//
//			/*isStop = (y_mario <= SCREEN_HEIGHT / 2) ? true : false;
//
//			if (isStop)
//			{
//			y_mario -= offset;
//			offset = -offset;
//			}*/
//
//			if (alpha > 0)
//				alpha -= 10;
//			else if (alpha <= 0)
//				alpha = 255;
//
//			/*if (index == 8)
//			index = 0;*/
//
//			render_frame(x_mario, y_mario, index, alpha, TRANSPARENT_DEFAULT);
//
//			index++;
//		}
//
//	}
//
//	// clean up DirectX and COM
//	cleanD3D();
//
//	return msg.wParam;
//}
//
//
//// this is the main message handler for the program
//LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
//{
//	switch (message)
//	{
//	case WM_DESTROY:
//	{
//		PostQuitMessage(0);
//		return 0;
//	} break;
//	}
//
//	return DefWindowProc(hWnd, message, wParam, lParam);
//}
//
//
//void render_frame(float x_mario, float y_mario, int index, int alpha, D3DCOLOR transparent)
//{
//	//d3ddev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 155, 0), 1.0f, 0);
//	/*d3ddev->Clear(0, NULL, D3DCLEAR_TARGET, TRANSPARENT_DEFAULT, 1.0f, 0);*/
//	d3ddev->Clear(0, NULL, D3DCLEAR_TARGET, transparent, 1.0f, 0);
//
//	d3ddev->BeginScene();
//
//	// Render Sprite
//	_SpriteHandler->Begin(D3DXSPRITE_ALPHABLEND);
//
//	RECT srect;
//	/*srect.left = index*WIDTH_IMAGE;
//	srect.top = 0;
//	srect.right = srect.left + WIDTH_IMAGE;
//	srect.bottom = HEIGHT_IMAGE;*/
//
//	srect.left = 0;
//	srect.top = 0;
//	srect.right = WIDTH_IMAGE;
//	srect.bottom = HEIGHT_IMAGE;
//
//	/*x_mario += 5;
//	y_mario += 8;*/
//
//	D3DXVECTOR3 position((float)x_mario, (float)y_mario, 0.0f);
//
//	D3DXMATRIX mt;
//	D3DXMatrixIdentity(&mt);
//
//	//  1	 0	 0	 0
//	mt._22 = -1.0f;				//  0   -1	 0	 0
//	mt._41 = -0;					//  0	 0	 1	 0
//	mt._42 = SCREEN_HEIGHT;				// -x0	 y0	 0	 1
//
//	D3DXVECTOR4 vp_pos;
//	D3DXVec3Transform(&vp_pos, &position, &mt);
//
//	D3DXVECTOR3 p(vp_pos.x, vp_pos.y, 0.0f);
//	D3DXVECTOR3 center((float)WIDTH_IMAGE / 2, (float)HEIGHT_IMAGE / 2, 0.0f);
//
//	/*D3DXMATRIX matscale;
//	D3DXVECTOR2 drawScale(1.5f, 1.5f);
//	D3DXMatrixTransformation2D(&matscale, NULL, 0.0, &drawScale, NULL, 0.0f, NULL);
//
//
//	_SpriteHandler->SetTransform(&matscale);*/
//
//	int color = rand() % 180 + 100;
//
//	_SpriteHandler->Draw(_Image,
//		&srect,
//		&center,
//		&p,
//		D3DCOLOR_ARGB(alpha, color, color, color));
//
//	_SpriteHandler->End();
//
//
//	d3ddev->EndScene();
//
//	d3ddev->Present(NULL, NULL, NULL, NULL);
//}
//
//// this function initializes and prepares Direct3D for use
//void initD3D(HWND hWnd)
//{
//	d3d = Direct3DCreate9(D3D_SDK_VERSION);
//
//	D3DPRESENT_PARAMETERS d3dpp;
//
//	ZeroMemory(&d3dpp, sizeof(d3dpp));
//	d3dpp.Windowed = TRUE;
//	d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
//	d3dpp.hDeviceWindow = hWnd;
//	d3dpp.BackBufferFormat = D3DFMT_X8R8G8B8;
//	d3dpp.BackBufferWidth = SCREEN_WIDTH;
//	d3dpp.BackBufferHeight = SCREEN_HEIGHT;
//
//	// create a device class using this information and the info from the d3dpp stuct
//	d3d->CreateDevice(D3DADAPTER_DEFAULT,
//		D3DDEVTYPE_HAL,
//		hWnd,
//		D3DCREATE_SOFTWARE_VERTEXPROCESSING,
//		&d3dpp,
//		&d3ddev);
//
//	init_graphics();    // call the function to initialize the triangle
//
//	d3ddev->SetRenderState(D3DRS_LIGHTING, FALSE);    // turn off the 3D lighting
//}
//
//// this is the function that cleans up Direct3D and COM
//void cleanD3D(void)
//{
//	v_buffer->Release();    // close and release the vertex buffer
//	d3ddev->Release();    // close and release the 3D device
//	d3d->Release();    // close and release Direct3D
//}
//
//// this is the function that puts the 3D models into video RAM
//void init_graphics(void)
//{
//	// create the vertices using the CUSTOMVERTEX struct
//	CUSTOMVERTEX vertices[] =
//	{
//		{ 3.0f, -3.0f, 0.0f, D3DCOLOR_XRGB(0, 0, 255), },
//		{ 0.0f, 3.0f, 0.0f, D3DCOLOR_XRGB(0, 255, 0), },
//		{ -3.0f, -3.0f, 0.0f, D3DCOLOR_XRGB(255, 0, 0), },
//	};
//
//	// create a vertex buffer interface called v_buffer
//	d3ddev->CreateVertexBuffer(3 * sizeof(CUSTOMVERTEX),
//		0,
//		CUSTOMFVF,
//		D3DPOOL_MANAGED,
//		&v_buffer,
//		NULL);
//
//	VOID* pVoid;    // a void pointer
//
//	// lock v_buffer and load the vertices into it
//	v_buffer->Lock(0, 0, (void**)&pVoid, 0);
//	memcpy(pVoid, vertices, sizeof(vertices));
//	v_buffer->Unlock();
//}
//
//void init_sprite(LPD3DXSPRITE SpriteHandler, LPWSTR FilePath)
//{
//	D3DXIMAGE_INFO info;
//	HRESULT result;
//
//	_Image = NULL;
//	_SpriteHandler = SpriteHandler;
//
//	result = D3DXGetImageInfoFromFile(FilePath, &info);
//	if (result != D3D_OK)
//	{
//		return;
//	}
//
//	LPDIRECT3DDEVICE9 d3ddv;
//	SpriteHandler->GetDevice(&d3ddv);
//
//	result = D3DXCreateTextureFromFileEx(
//		d3ddv,
//		FilePath,
//		info.Width,
//		info.Height,
//		1,
//		D3DUSAGE_DYNAMIC,
//		D3DFMT_UNKNOWN,
//		D3DPOOL_DEFAULT,
//		D3DX_DEFAULT,
//		D3DX_DEFAULT,
//		D3DCOLOR_XRGB(128, 0, 0),
//		&info,
//		NULL,
//		&_Image);
//
//	if (result != D3D_OK)
//	{
//		return;
//	}
//
//}